#ifndef PAGERENDERER_H
#define PAGERENDERER_H

#include <QObject>
#include <QImage>
#include <QList>
#include "layoutstatemanager.h"
#include "processingsettings.h"  // 添加ProcessingSettings头文件

/**
 * PageRenderer - 页面渲染器
 *
 * Extract Class重构：从MainWindow中提取页面渲染逻辑
 * 负责各种布局模式下的页面重新排列和组合渲染
 *
 * 职责：
 * - 单栏/双栏/三栏页面重新排列
 * - 垂直流布局渲染
 * - 组合页面生成
 * - A4尺寸页面合成
 */
class PageRenderer : public QObject
{
    Q_OBJECT

public:
    // 打包返回的组合结果
    struct CompositeLayout {
        QList<QImage> pages;                         // 组合后的页面
        QHash<int, QHash<int, QRect>> layoutRects;   // 组合页索引 -> (原始页索引 -> QRect)
    };

    explicit PageRenderer(QObject *parent = nullptr);

    /**
     * 根据布局模式重新排列页面
     * @param originalPages 原始页面列表
     * @param mode 布局模式（单栏/双栏/三栏）
     * @return 重新排列后的页面列表
     */
    QList<QImage> rearrangePagesForColumns(const QList<QImage>& originalPages,
                                          LayoutMode mode);

    // 新增：返回打包结果（页面+布局矩形）
    CompositeLayout rearrangeWithLayout(const QList<QImage>& originalPages,
                                        LayoutMode mode);

    /**
     * 生成指定索引的组合页面
     * @param originalPages 原始页面列表
     * @param compositeIndex 组合页面索引
     * @param mode 布局模式
     * @return 组合页面图像
     */
    QImage composeCompositePageAt(const QList<QImage>& originalPages,
                                 int compositeIndex,
                                 LayoutMode mode);

    /**
     * 垂直流布局渲染
     * @param columnImages 每列的图像列表
     * @param columnImageWidths 每列的图像宽度列表
     * @param columns 列数
     * @param columnWidth 列宽
     * @param columnSpacing 列间距
     * @param marginTop 上边距
     * @param marginLeft 左边距
     * @param marginBottom 下边距
     * @param a4Width A4页面宽度
     * @param a4Height A4页面高度
     * @param availableHeight 可用高度
     * @return 渲染后的页面图像
     */
    QImage renderVerticalFlowLayout(const QList<QList<QImage>>& columnImages,
                                  const QList<int>& columnImageWidths,
                                  int columns, int columnWidth, int columnSpacing,
                                  int marginTop, int marginLeft, int marginBottom,
                                  int a4Width, int a4Height, int availableHeight,
                                  const QVector<int>* originalIndices = nullptr,
                                  QHash<int, QRect>* outOriginalToRect = nullptr);

    // 计算版面矩形（列优先顺序展平），不负责绘制
    QVector<QRect> computeVerticalFlowLayout(const QList<QList<QImage>>& columnImages,
                                            int columns, int columnWidth, int columnSpacing,
                                            int marginTop, int marginLeft, int marginBottom,
                                            int a4Width, int a4Height, int availableHeight,
                                            const QVector<int>* originalIndices = nullptr,
                                            QHash<int, QRect>* outOriginalToRect = nullptr,
                                            bool useLogicalAllocation = true) const;

    /**
     * 计算每个组合页包含的源页数量
     * @param mode 布局模式
     * @return 每个组合页的源页数量
     */
    int pagesPerComposite(LayoutMode mode) const;

    /**
     * 设置渲染设置（包括边距配置）
     * @param settings 处理设置
     */
    void setRenderSettings(const ProcessingSettings* settings);

private:
    // 双栏布局重新排列
    QList<QImage> rearrangeForTwoColumns(const QList<QImage>& originalPages);

    // 三栏布局重新排列
    QList<QImage> rearrangeForThreeColumns(const QList<QImage>& originalPages);

    // 通用多栏重新排列
    QList<QImage> rearrangePagesInColumns(const QList<QImage>& originalPages,
                                         int columns, int maxPagesPerColumn);

    // 绘制占位符
    void drawBeautifulPlaceholder(QPainter* painter, const QSize& size, int pageIndex, int x, int y);

    // 动态边距计算 - 替代硬编码常量
    int getEffectiveMarginSize() const;
    int getEffectiveColumnSpacing() const;
    QSize getEffectiveA4Size() const;

    // 常量定义 - 与原MainWindow保持一致
    static const int A4_WIDTH = 1240;   // A4宽度（150 DPI）
    static const int A4_HEIGHT = 1754;  // A4高度（150 DPI）
    static const int DEFAULT_MARGIN_SIZE = 80;   // 默认页边距（向后兼容）
    static const int COLUMN_SPACING = 30; // 默认列间距（与原来保持一致）

    // 渲染设置
    const ProcessingSettings* m_settings = nullptr;

    // 记录每个组合页中，各原始页面的实际绘制矩形（像素坐标）
    // key: compositeIndex -> (originalPageIndex -> QRect)
    QHash<int, QHash<int, QRect>> m_layoutRects;

public:
    // 提供查询接口：获取某组合页中某原始页的实际绘制位置
    QRect getOriginalRectInComposite(int compositeIndex, int originalPageIndex) const;
    void clearLayoutRects();
    QHash<int, QHash<int, QRect>> getLayoutRects() const { return m_layoutRects; }
};

#endif // PAGERENDERER_H